package com.imax.center.service.impl.h3yun;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;

/**
 * 业务对象处理工具类
 */
@Slf4j
public class BizHandler {

    /**
     * 创建子节点对象
     * @param region 区域数据
     * @return 子节点对象
     */
    public static JSONObject createChildNode(JSONObject region) {
        JSONObject childNode = new JSONObject();
        childNode.put("value", region.getString("AreaCode"));
        childNode.put("label", region.getString("AreaName"));
        childNode.put("level", region.getIntValue("CityLevel"));
        
        // 处理经纬度中心点
        Double lng = region.getDouble("Lng");
        Double lat = region.getDouble("Lat");
        if (lng != null && lat != null) {
            JSONArray center = new JSONArray();
            center.add(lng);
            center.add(lat);
            childNode.put("center", center);
        }
        
        return childNode;
    }
    
    /**
     * 递归添加子节点，并按value字段升序排序
     * @param parentNode 父节点
     * @param regions 所有区域数据
     * @param parentCode 父节点代码
     */
    public static void appendChildren(JSONObject parentNode, JSONArray regions, String parentCode) {
        // 查找所有直接子节点
        List<JSONObject> childrenList = new ArrayList<>();
        
        for (int i = 0; i < regions.size(); i++) {
            JSONObject region = regions.getJSONObject(i);
            String currentParentCode = region.getString("ParentCode");
            
            if (parentCode.equals(currentParentCode)) {
                JSONObject childNode = createChildNode(region);
                
                // 继续递归查找子节点的子节点
                appendChildren(childNode, regions, region.getString("AreaCode"));
                
                childrenList.add(childNode);
            }
        }
        
        if (!childrenList.isEmpty()) {
            // 按照value字段升序排序
            childrenList.sort(Comparator.comparing(obj -> obj.getString("value")));
            
            // 转换为JSONArray
            JSONArray childrenArray = new JSONArray();
            childrenArray.addAll(childrenList);
            
            parentNode.put("children", childrenArray);
        }
    }
    
    /**
     * 将平面区域数据转换为树形结构
     * @param regions 区域数据列表
     * @param parentCode 父级区域代码
     * @return 树形结构的根节点
     */
    public static JSONObject buildRegionTree(JSONArray regions, String parentCode) {
        if (regions == null || regions.isEmpty()) {
            return new JSONObject();
        }
        
        // 创建根节点对象
        JSONObject rootNode = new JSONObject();

        // 查找指定的父级节点
        JSONObject parentRegion = null;
        for (int i = 0; i < regions.size(); i++) {
            JSONObject region = regions.getJSONObject(i);
            if (parentCode.equals(region.getString("AreaCode"))) {
                parentRegion = region;
                break;
            }
        }

        if (parentRegion != null) {
            // 设置根节点信息
            rootNode.put("value", parentRegion.getString("AreaCode"));
            rootNode.put("label", parentRegion.getString("AreaName"));
            rootNode.put("level", parentRegion.getIntValue("CityLevel"));

            // 处理经纬度中心点
            Double lng = parentRegion.getDouble("Lng");
            Double lat = parentRegion.getDouble("Lat");
            if (lng != null && lat != null) {
                JSONArray center = new JSONArray();
                center.add(lng);
                center.add(lat);
                rootNode.put("center", center);
            }

            // 递归构建子节点
            appendChildren(rootNode, regions, parentCode);
        }
        
        return rootNode;
    }

} 